package de.fhffm.gärtnerei.gui;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableModel;

import de.fhffm.gärtnerei.tabellen.Aussaat;
import de.fhffm.gärtnerei.tabellen.Bewaesserung;
import de.fhffm.gärtnerei.tabellen.Duenger;
import de.fhffm.gärtnerei.tabellen.Pflanze;
import de.fhffm.gärtnerei.tabellen.Wachstum;
import de.fhffm.gärtnerei.tabellenModelle.AussaatTableModel;
import de.fhffm.gärtnerei.tabellenModelle.DuengerTableModel;
import de.fhffm.gärtnerei.tabellenModelle.PflanzeTableModel;

public class BearbeitenTabellenFenster implements ActionListener {

	private JButton btnBearbeiten = new JButton("Bearbeiten");
	private JButton btnLoeschen = new JButton("Löschen");
	private JButton btnAbbrechen = new JButton("Abbrechen");
	
	private JFrame bearbeitenFrame = new JFrame();
	
	private JTable table = new JTable();
	
	private JScrollPane scrollPane = new JScrollPane(table);
	
	private JPanel tabellenPanel = new JPanel();
	
	private List<String> ausgewaehlteZeile = new ArrayList<String>();
	private int modus = 0;
	
	private StringBuilder sb = new StringBuilder();
	
	private Object[] options = {"Ja!","Abbrechen!"};
	
	
	
	public BearbeitenTabellenFenster(int modus){

		this.modus = modus;
		System.out.println(modus);
		
		bearbeitenFrame.setSize(800,600);
		bearbeitenFrame.setLocationRelativeTo(null);
		bearbeitenFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		bearbeitenFrame.setResizable(true);
		bearbeitenFrame.setLayout(new FlowLayout());
		
		setzeTableModel();
		scrollPane.setPreferredSize(new Dimension(600,400));
		tabellenPanel.add(scrollPane);
		bearbeitenFrame.add(tabellenPanel);	
		bearbeitenFrame.add(btnBearbeiten);
		btnBearbeiten.addActionListener(this);
		bearbeitenFrame.add(btnLoeschen);
		btnLoeschen.addActionListener(this);
		bearbeitenFrame.add(btnAbbrechen);
		btnAbbrechen.addActionListener(this);

		bearbeitenFrame.setVisible(true);
		bearbeitenFrame.pack();
		
		
	}
	
	private void setzeTableModel() {
		
		switch(modus){
		case 1: 
			table.setModel(new PflanzeTableModel());
			bearbeitenFrame.setTitle("Pflanze Bearbeiten");
			break;
		case 2:
			table.setModel(new DuengerTableModel());
			bearbeitenFrame.setTitle("Duenger Bearbeiten");
			break;
		case 3:
			table.setModel(new AussaatTableModel());
			bearbeitenFrame.setTitle("Aussaat Bearbeiten");
			break;
		}
		
	}

	

	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		
		if(obj == btnBearbeiten){
			if(doHohleAusgewaehlteZeile()){
				/*System.out.println(ausgewaehlteZeile.get(0));
				System.out.println(ausgewaehlteZeile.get(1));
				System.out.println(ausgewaehlteZeile.get(2));
				System.out.println(ausgewaehlteZeile.get(3));
				System.out.println(ausgewaehlteZeile.get(4));
				System.out.println(ausgewaehlteZeile.get(5)); */ 
				
				switch(modus){
				case 1:
					new PflanzeBearbeitenFenster(ausgewaehlteZeile);
					bearbeitenFrame.dispose();
					break;
				case 2:
					new DuengerBearbeitenFenster(ausgewaehlteZeile);
					bearbeitenFrame.dispose();
					break;
				case 3:
					new AussaatBearbeitenFenster(ausgewaehlteZeile);
					bearbeitenFrame.dispose();
					break;
				}

			} else {
				System.out.println("Fehler beim hohlen der Pflanze");
			}
		}
		
		if(obj == btnLoeschen){
			
			if(doHohleAusgewaehlteZeile()){
				switch(modus){
				case 1:
					warnungLoeschePflanze();
					break;
				case 2:
					warnungLoescheDuenger();
					break;
				case 3:
					warnungLoescheAussaat();
					break;
					
				}					
			
			} else{
				System.out.println("Fehler beim hohlen der Pflanze");
			}
				
			
		}
			
			
		
		if(obj == btnAbbrechen){
			bearbeitenFrame.dispose();
		}
		
	} 

	private void warnungLoescheAussaat() {

		int selected = JOptionPane.showOptionDialog(null, "Wenn Sie diese Aussaat löschen, werden alle dazugehörigen Fortschritte (Wachstum & Bewässerung) auch gelöscht"
		, "ACHTUNG!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]);
		
		switch(selected){
		case 0:
			loescheAusgewaehlteAussaat();
			loeschenBestaetigen();
			break;
		case 1:
			System.out.println("Abbruch Aussaat löschen");
			break;
		}
	}

	private void loescheAusgewaehlteAussaat() {
		
		int wachstumID = 0;
		int bewaesserungID = 0;
		int aussaatID = Integer.parseInt(ausgewaehlteZeile.get(0));
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();

		Query q = em.createQuery("SELECT a FROM Aussaat a WHERE a.aussaatID =:ID");
		  q.setParameter("ID",aussaatID);
		 
		 Aussaat aussaat = (Aussaat) q.getSingleResult();
		 Wachstum wachstum = aussaat.getWachstum();
		 Bewaesserung bewaesserung = aussaat.getBewaesserung();
		 
		 try{
			 wachstumID = wachstum.getWachstumID();
		 }catch(NullPointerException e){
			 System.out.println("Kein Wachstum vorhanden vorhanden");
		 }
		 try{
			 bewaesserungID = bewaesserung.getBewaesserungID();
		 }catch(NullPointerException e){
			 System.out.println("Keine Bewässerung vorhanden");
		 }
		 
		 q = em.createQuery("DELETE FROM Wachstum w WHERE w.wachstumID =:ID");
		 	 q.setParameter("ID", wachstumID);
		 	 q.executeUpdate();
		 	 
		 	 
		 q = em.createQuery("DELETE FROM Bewaesserung b WHERE b.bewaesserungID =:ID");
		 	q.setParameter("ID",bewaesserungID);
		 	q.executeUpdate();
		 	
		 	
		 q = em.createQuery("DELETE FROM Aussaat a WHERE a.aussaatID =:ID");
		 	q.setParameter("ID", aussaatID);
		 	q.executeUpdate();
		 
		 
	  
		em.getTransaction().commit();
		em.close(); 
		
		
	}

	private void warnungLoescheDuenger() {

		int selected = JOptionPane.showOptionDialog(null, "Wenn Sie diesen Dünger löschen, werden ALLE aktuellen Aussaaten die diese Dünger nutzen auch gelöscht!"
		, "ACHTUNG!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]);
		
		switch(selected){
		case 0:
			loescheAusgewaehltenDuenger();
			break;
		case 1:
			System.out.println("Abbruch Dünger löschen");
			break;
		}
		
	}

	private void loescheAusgewaehltenDuenger() {
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		findeAussaatDuenger();
		
		Query q = em.createQuery("DELETE FROM Duenger d WHERE d.duengerMarke = :name");
			    q.setParameter("name", ausgewaehlteZeile.get(0)).executeUpdate();
		
		em.getTransaction().commit();
		em.close();
		
		sb.append("Es wurde der Dünger mit der Marke: ").append(ausgewaehlteZeile.get(0)).append(" gelöscht");
		loeschenBestaetigen();
		
	}

	private void findeAussaatDuenger() {
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT d FROM Duenger d WHERE d.duengerMarke = :name");
		  q.setParameter("name", ausgewaehlteZeile.get(0));  

		Duenger d  = (Duenger) q.getSingleResult();			
		List<Aussaat> aussaatZumLoeschen = d.getAussaat();	

		loescheAussaat(aussaatZumLoeschen);
		
		
		em.persist(d);
		em.getTransaction().commit();
		em.close();
		
	}
		
	

	private void loescheAussaat(List<Aussaat> aussaatZumLoeschen) {
		int wachstumID = 0;
		int bewaesserungID = 0;
		
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		sb.append("Es wurden ").append(aussaatZumLoeschen.size()).append(" Aussaaten mit den folgenden ID/s gelöscht: \n");
		
		if(aussaatZumLoeschen.isEmpty()){
			sb.append("'Keine Aussaaten gefunden die das zu löschende Element verwenden'\n");
		}else{
			/*
			 * Wenn Aussaat/en vorhanden dan wird die Liste  durchsucht und Aussaat/en  gelöscht!
			 */
			for(Aussaat a: aussaatZumLoeschen){
				sb.append("ID: ").append(a.getAussaatID()).append(" ");

				 Wachstum wachstum = a.getWachstum();
				 Bewaesserung bewaesserung = a.getBewaesserung();
				 
				 try{
					 wachstumID = wachstum.getWachstumID();
				 }catch(NullPointerException e){
					 System.out.println("Kein Wachstum vorhanden vorhanden");
				 }
				 try{
					 bewaesserungID = bewaesserung.getBewaesserungID();
				 }catch(NullPointerException e){
					 System.out.println("Keine Bewässerung vorhanden");
				 }
				 
				 Query q = em.createQuery("DELETE FROM Wachstum w WHERE w.wachstumID =:ID");
				 	 q.setParameter("ID", wachstumID);
				 	 q.executeUpdate();
				 	 
				 	 
				 q = em.createQuery("DELETE FROM Bewaesserung b WHERE b.bewaesserungID =:ID");
				 	q.setParameter("ID",bewaesserungID);
				 	q.executeUpdate();
				 	
				 	
				 q = em.createQuery("DELETE FROM Aussaat a WHERE a.aussaatID =:ID");
				 	q.setParameter("ID", a.getAussaatID());
				 	q.executeUpdate();
					
					
					
			}
			sb.append("\n");
		}		
		em.getTransaction().commit();
		em.close();
	}

	private void warnungLoeschePflanze() {
		Object[] options = {"Ja!","Abbrechen!"};
		int selected = JOptionPane.showOptionDialog(null, "Wenn Sie diese Pflanze löschen, werden ALLE aktuellen Aussaaten die diese Pflanze enthalten auch gelöscht!"
		, "ACHTUNG!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]);
		
		switch (selected){
	
		case 0:
			loescheAusgewaehltePflanze();		
			break;
	
		case 1:
			System.out.println("Abbruch Pflanze löschen");
		break;
		}
		
	}



	private void loescheAusgewaehltePflanze() {
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		//Erst müssen die Aussaaten gelöscht werden die die zu löschende Pflanze
		//beinhalten
		findeAussaatPflanze();
		
		Query q = em.createQuery("DELETE FROM Pflanze p WHERE p.sorte = :name");
			    q.setParameter("name", ausgewaehlteZeile.get(0)).executeUpdate();
		
		em.getTransaction().commit();
		em.close();
		
		sb.append("Und die Pflanze mit der Sorte: ").append(ausgewaehlteZeile.get(0));
		loeschenBestaetigen();
		
		
	}
	private void findeAussaatPflanze() {

		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT p FROM Pflanze p WHERE p.sorte = :name");
		  q.setParameter("name", ausgewaehlteZeile.get(0));
		  
		  
		/*
		 * Pflanze wird gehohlt, alle Aussaaten in der sich die Pflanze befindet
		 * werden in einer Liste gespeichert
		 */
		Pflanze p  = (Pflanze) q.getSingleResult();			
		List<Aussaat> aussaatZumLoeschen = p.getAussaat();	
			
		loescheAussaat(aussaatZumLoeschen);
		
		
		em.persist(p);
		em.getTransaction().commit();
		em.close();
		
	}


	private void loeschenBestaetigen() {
		Object[] options = {"Ok"};
		
		// Bestätigung wird ausgegeben und StringBuilder resetet
		
		JOptionPane.showOptionDialog(null,sb.toString(), "Löschen Erfolgreich", JOptionPane.YES_OPTION,
				   JOptionPane.OK_OPTION, null , options, null);
		sb.setLength(0);
	
		/*switch(modus){
		case 1: // Pflanze

			sb.setLength(0);
			bearbeitenFrame.dispose();
			break;
		case 2: // Dünger
			JOptionPane.showOptionDialog(null,sb.toString(), "Löschen Erfolgreich", JOptionPane.YES_OPTION,
					   JOptionPane.OK_OPTION, null , options, null);
			sb.setLength(0);
			bearbeitenFrame.dispose();
			break;
		case 3: // Aussaat
			//Aussaat bestätigung
			break;
		}*/

		
	}

	private boolean doHohleAusgewaehlteZeile() {
		
		int ausgwZeile = table.getSelectedRow();
		
		try{
			switch(modus){
			
			case 1:	//Pflanze
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 1));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 2));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 3));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 4));
					ausgewaehlteZeile.add(((Integer) table.getModel().getValueAt(ausgwZeile, 5)).toString());
					ausgewaehlteZeile.add(((Integer) table.getModel().getValueAt(ausgwZeile, 6)).toString());
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 7));
					break;
			case 2: // Dünger
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 1));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 2));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 3));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 4));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 5));
				break;
			case 3://Aussaat
					ausgewaehlteZeile.add(((Integer) table.getModel().getValueAt(ausgwZeile, 0)).toString());
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 1));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 2));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 3));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 4));
					ausgewaehlteZeile.add((String) table.getModel().getValueAt(ausgwZeile, 5));
				break;
			}
		
		}catch(IllegalArgumentException ia){
			
			System.out.println("Bitte eine Zeile auswählen");
			JOptionPane.showMessageDialog(null,"Bitte eine Zeile auswählen","Fehler",JOptionPane.ERROR_MESSAGE);
			return false;
			
		}
		
		return true;
		
	}

}

	

